home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / redakcyjne / Ultra Explorer / UltraExplorerSetup.exe / {app} / UltraExplorer.chm / scripts.js < prev    next >
Text File  |  2007-10-16  |  40KB  |  1,445 lines

  1. ///////////////////////////////////////////////////////////////////////////////////////////////
  2. // Doc-O-Matic(R) 5 script file.
  3. // Copyright (C) 2000-2006 by toolsfactory software inc.
  4. // http://www.toolsfactory.com
  5. // http://www.doc-o-matic.com
  6. //
  7. // Distribution permitted as part of browser-based
  8. // Help systems generated by Doc-O-Matic(R).
  9. ///////////////////////////////////////////////////////////////////////////////////////////////
  10.  
  11.  
  12. ///////////////////////////////////////////////////////////////////////////////////////////////
  13. // Available variables which are resolved when Doc-O-Matic use the file:
  14. //
  15. //    HEADER_FILE, TOCIDX_FILE, DEFAULT_TITLE_FILE, DEFAULT_TOPIC_FILE
  16. //
  17. //    SCRIPT_FILE, SCRIPT_FUNCTION_ONLOAD
  18. //    STYLESHEET_FILE
  19. //
  20. //    WINDOW_NAME_HEADER, WINDOW_NAME_TOPIC, WINDOW_NAME_NAVIGATION
  21. //    WINDOW_NAME_ADDINFO, WINDOW_NAME_HIERARCHY, WINDOW_NAME_SEEALSO,
  22. //    WINDOW_NAME_LEGEND, WINDOW_NAME_BODYSOURCE, WINDOW_NAME_TOCIDX
  23. //
  24. //    TOC_IMAGE_PLUS, TOC_IMAGE_MINUS, SECTION_IMAGE_PLUS, SECTION_IMAGE_MINUS,
  25. //    COLLAPSE_COOKIE_NAME, COLLAPSE_PERSISTENTSTORE_NAME,
  26. //    COLLAPSE_STATESAVE_USECOOKIES, COLLAPSE_STATESAVE_USEPERSISTENCE
  27. //
  28. //    TOC_GROUP_CLASSNAME, TOC_TOPIC_CLASSNAME
  29. //    TOC_HIGHLIGHT_GROUP_CLASSNAME, TOC_HIGHLIGHT_TOPIC_CLASSNAME
  30. ///////////////////////////////////////////////////////////////////////////////////////////////
  31.  
  32. ///////////////////////////////////////////////////////////////////////////////////////////////
  33. // retrieves a variable from the search string
  34. function getStringVar(varname) {
  35.     var searchstr = document.location.search;
  36.     var varidx = searchstr.indexOf(varname);
  37.  
  38.     if(varidx >= 0) {
  39.         var startpos = varidx + varname.length +1;
  40.         searchstr = searchstr.substring(startpos, searchstr.length);
  41.  
  42.         var nextpos = searchstr.length;
  43.         if (searchstr.indexOf('&') >= 0) {
  44.             nextpos = searchstr.indexOf('&');
  45.         }
  46.  
  47.         searchstr = searchstr.substring(0, nextpos);
  48.     } else {
  49.         searchstr = '';
  50.     }
  51.  
  52.     return unescape(searchstr);
  53. };
  54.  
  55. ///////////////////////////////////////////////////////////////////////////////////////////////
  56. // searches the entire frameset and returns
  57. // the frame with name frmname
  58. function findFrame(w, frmname) {
  59.     var res = null;
  60.  
  61.     if (frmname != '') {
  62.         res = w.frames[frmname];
  63.  
  64.         // if it's not in the current window
  65.         // search the sub-frames
  66.         if (res == null) {
  67.             var L = w.frames.length;
  68.             var i;
  69.  
  70.             for (i = 0; i < L; i++) {
  71.                 res = findFrame(w.frames[i], frmname);
  72.                 if (res != null) {
  73.                     break;
  74.                 }
  75.             }
  76.         }
  77.     } else {
  78.         result = this;
  79.     }
  80.  
  81.     return res;
  82. };
  83.  
  84. ///////////////////////////////////////////////////////////////////////////////////////////////
  85. // loads frame frmname with frmfile
  86. function fillFrame(frmname, frmfile) {
  87.     var theframe = findFrame(top, frmname);
  88.  
  89.     if (theframe != null) {
  90.         theframe.location.replace(frmfile);
  91.     }
  92.     return true;
  93. };
  94.  
  95. ///////////////////////////////////////////////////////////////////////////////////////////////
  96. // Called when the frameset file is loaded.
  97. // Loads the framefile passed on the
  98. // search string into the frame also passed
  99. // on the search string
  100. function loadTopicFrame() {
  101.     var frmname = getStringVar('frmname');
  102.     var frmfile = getStringVar('frmfile');
  103.  
  104.     if ((frmname != '') && (frmfile != '')) {
  105.         fillFrame(frmname, frmfile);
  106.     }
  107.     
  108.     return true;
  109. };
  110.  
  111.  
  112. var called = false;
  113.  
  114. ///////////////////////////////////////////////////////////////////////////////////////////////
  115. // ensures the current file is displayed within
  116. // a frameset, if not loads the frame set which
  117. // loads the file itself into the frameset.
  118. function loadFrameSetOrTitle(framesetfile, targetframe, topicfile)
  119. {
  120.     if (!called) {
  121.         called = true;
  122.         if (self == top) {
  123.             top.location.replace(framesetfile + '?frmname=' + escape(targetframe) + '&frmfile=' + escape(topicfile));
  124.         }
  125.     }
  126.  
  127.     return true;
  128. };
  129.  
  130. ///////////////////////////////////////////////////////////////////////////////////////////////
  131. // shows or hides a DIV based on whether
  132. // it's visible or not. Also toggles the corresponding
  133. // expand/collaps graphic.
  134. function internalToggleVisibilityEx2(theDocument, imgID, divID, storeVisibilityState, storeID, forceHide, forceShow, imgplussrc, imgminussrc)
  135. {
  136.     var div = theDocument.getElementById(divID);
  137.     var img = theDocument.getElementById(imgID);
  138.  
  139.     if (div != null) {
  140.         // Unfold the branch if it isn't visible
  141.         if (((!forceHide) || forceShow) && (div.style.display == 'none')) {
  142.             if (img != null) {
  143.                 img.src = imgminussrc;
  144.             }
  145.             div.style.display = '';
  146.  
  147.             // store the state so we can recreate it
  148.             if (storeVisibilityState) {
  149.                 saveVisibilityState(storeID, true);
  150.             }
  151.         // Collapse the branch if it IS visible
  152.         } else if (!forceShow) {
  153.             if (img != null) {
  154.                 img.src = imgplussrc;
  155.             }
  156.             div.style.display = 'none';
  157.  
  158.             // store the state so we can recreate it
  159.             if (storeVisibilityState) {
  160.                 saveVisibilityState(storeID, false);
  161.             }
  162.         }
  163.     }
  164. }
  165.  
  166. function internalToggleVisibilityEx(imgID, divID, storeVisibilityState, storeID, forceHide, forceShow, imgplussrc, imgminussrc)
  167. {
  168.     internalToggleVisibilityEx2(document, imgID, divID, storeVisibilityState, storeID, forceHide, forceShow, imgplussrc, imgminussrc);
  169. }
  170.  
  171.  
  172. // toggles the visibility of divID and
  173. // changes the img accordingly.
  174. function toggleVisibilityTOC(imgID, divID)
  175. {
  176.     internalToggleVisibilityEx(imgID, divID, false, "", false, false, "btn_toc_expand.gif", "btn_toc_collapse.gif");
  177. }
  178.  
  179. function toggleVisibilitySection(imgID, divID)
  180. {
  181.     internalToggleVisibilityEx(imgID, divID, false, "", false, false, "btn_expand_large.gif", "btn_collapse_large.gif");
  182. }
  183.  
  184. // toggles the visibility of an item identified
  185. // by storeID. To get the corresponding img
  186. // and div ids, storeID is prefixed by
  187. // "img" and "div".
  188. function toggleVisibilityStored(storeID)
  189. {
  190.     var imgID = "img" + storeID;
  191.     var divID = "div" + storeID;
  192.     internalToggleVisibilityEx(imgID, divID, true, storeID, false, false, "btn_expand_large.gif", "btn_collapse_large.gif");
  193. }
  194.  
  195. function isCorrespondingTOCItem(href, topicfile)
  196. {
  197.     var result = false;
  198.     var pathidx = href.lastIndexOf("/");
  199.     var filename = "";
  200.  
  201.     if (pathidx >= 0) {
  202.         filename = href.substring(pathidx+1, href.length);
  203.  
  204.         if (filename == topicfile) {
  205.             result = true;
  206.         }
  207.     }
  208.  
  209.     return result;
  210. }
  211.  
  212. function expandTOC(framedoc, element)
  213. {
  214.     var baseid = "";
  215.     var outerdiv = null;
  216.     var pelement = element.parentNode;
  217.  
  218.     while (pelement != null) {
  219.         if ((pelement.tagName == "DIV") && (pelement.id.substring(0, 3) == "div")) {
  220.             baseid = pelement.id.substring(3, pelement.id.length);
  221.             outerdiv = pelement;
  222.             break;
  223.         }
  224.  
  225.         pelement = pelement.parentNode;
  226.     }
  227.  
  228.     if ((baseid != "") && (outerdiv != null)) {
  229.         // expand the div if necessary
  230.         internalToggleVisibilityEx2(framedoc, "img" + baseid, "div" + baseid, false, "", false, true, "btn_toc_expand.gif", "btn_toc_collapse.gif");
  231.  
  232.         // expand outer divs
  233.         expandTOC(framedoc, outerdiv);
  234.     }
  235.  
  236.     return true;
  237. }
  238.  
  239. // ensures element is scrolled into view
  240. // so it's visible on the page.
  241. function ensureTOCEntryVisible(framedoc, element)
  242. {
  243.     var pos = 0;
  244.     var scrollelement;
  245.     var id = "areascroll";
  246.  
  247.     // first see if we have a scroll area div
  248.     scrollelement = framedoc.getElementById(id);
  249.  
  250.     if (scrollelement == null) {
  251.         scrollelement = framedoc.body;
  252.     }
  253.  
  254.     if (scrollelement != null) {
  255.         var delta = 0;
  256.  
  257.         var viewtop = scrollelement.scrollTop + scrollelement.offsetTop;
  258.         var viewbottom = viewtop + scrollelement.offsetHeight;
  259.         var scrollbarheight = 30;
  260.         // the bottom-scrollbar's area is included in offsetHeight, so we have
  261.         // to subtract a appropriate amount to account for that
  262.         if (viewbottom > (scrollbarheight * 2)) {
  263.             viewbottom = viewbottom - scrollbarheight;
  264.         }
  265.         
  266.         var elementtop = element.offsetTop;
  267.         if (navigator.family == 'ie4') {
  268.             elementtop = elementtop + scrollelement.offsetTop;
  269.         }
  270.         var elementbottom = elementtop + element.offsetHeight;
  271.  
  272.         if (elementtop < viewtop) {
  273.             delta = (elementtop - viewtop);
  274.         } else if (elementbottom > viewbottom) {
  275.             delta = (elementbottom-viewbottom);
  276.         }
  277.  
  278.         if (delta != 0) {
  279.             scrollelement.scrollTop = scrollelement.scrollTop + delta;
  280.         }
  281.     }
  282. }
  283.  
  284. var currentTOCHighlightEntry = null;
  285. var currentTOCHighlightEntryClass = "";
  286.  
  287. // hightlights the TOC entry that has been scrolled
  288. // into view.
  289. function highlightTOCEntry(framedoc, element)
  290. {
  291.     if (framedoc.currentTOCHighlightEntry != null) {
  292.         framedoc.currentTOCHighlightEntry.className = framedoc.currentTOCHighlightEntryClass;
  293.  
  294.         framedoc.currentTOCHighlightEntry = null;
  295.         framedoc.currentTOCHighlightEntryClass = "";
  296.     }
  297.  
  298.     if (element != null) {
  299.         var newclassname = "";
  300.  
  301.         if (element.className == "Element860") {
  302.             newclassname = "Element874";
  303.         } else if (element.className == "Element862") {
  304.             newclassname = "Element875";
  305.         }
  306.  
  307.         if (newclassname != "") {
  308.             framedoc.currentTOCHighlightEntry = element;
  309.             framedoc.currentTOCHighlightEntryClass = element.className;
  310.  
  311.             element.className = newclassname;
  312.         }
  313.     }
  314. }
  315.  
  316. // searches for a link to topicfile in the TOC and
  317. // highlights the corresponding node in the tree.
  318. function synchTOC(topicfile)
  319. {
  320.     var frm = findFrame(top, "");
  321.     var links = null;
  322.     var idx;
  323.     var toctreeid = "toctree";
  324.     var treeroot;
  325.  
  326.     if (frm != null) {
  327.         treeroot = frm.document.getElementById(toctreeid);
  328.  
  329.         if (treeroot != null) {
  330.             links = treeroot.getElementsByTagName("a");
  331.  
  332.             for (idx=0; idx < links.length; idx++) {
  333.                 if (isCorrespondingTOCItem(links[idx].href, topicfile)) {
  334.                     expandTOC(frm.document, links[idx]);
  335.                     ensureTOCEntryVisible(frm.document, links[idx]);
  336.                     highlightTOCEntry(frm.document, links[idx]);
  337.                     break;
  338.                 }
  339.             }
  340.         }
  341.     }
  342.  
  343.     return true;
  344. }
  345.  
  346. ///////////////////////////////////////////////////////////////////////////////////////////////
  347. // Copies the content of the element identified by ID
  348. // to the clipboard. Works with Internet Explorer only.
  349. function CopyElementToClipboard(ID)
  350. {
  351.     var element = document.getElementById(ID);
  352.  
  353.     if (element != null) {
  354.         window.clipboardData.setData("Text", element.innerText);
  355.     }
  356. }
  357.  
  358.  
  359. ///////////////////////////////////////////////////////////////////////////////////////////////
  360. // Popup and Fixed Header
  361. //
  362.  
  363. ///////////////////////////////////////////////////////////////////////////////////////////////
  364. // support functions
  365.  
  366. // Returns a rectangle object initialized
  367. // with the given parameters.
  368. function Rectangle(left, top, width, height)
  369. {
  370.     this.left = left;
  371.     this.top = top;
  372.     this.width = width;
  373.     this.height = height;
  374. }
  375.  
  376. // Hides or shows a popup element
  377. function setElementVisible(element, v) {
  378.     if (v) {
  379.         element.style.visibility = "visible";
  380.     } else {
  381.         element.style.visibility = "hidden";
  382.     }
  383. }
  384.  
  385. // This function fills a rectange structure (r) with
  386. // the window coordinates of the page client area
  387. function getWindowClientArea(r)
  388. {
  389.     if (navigator.family == 'ie4') {
  390.        r.left = document.body.scrollLeft;
  391.     } else {
  392.        r.left = window.pageXOffset;
  393.     }
  394.  
  395.     if (navigator.family == 'ie4') {
  396.        r.top = document.body.scrollTop;
  397.     } else {
  398.        r.top = window.pageYOffset;
  399.     }
  400.  
  401.     r.width = window.document.body.clientWidth;
  402.     if (!r.width) {
  403.         r.width = window.innerWidth;
  404.     }
  405.     if (!r.width) {
  406.         r.width = window.outerWidth;
  407.     }
  408.  
  409.     r.height = window.document.body.clientHeight;
  410.     if (!r.height) {
  411.        r.height = window.innerHeight;
  412.     }
  413.     if (!r.height) {
  414.        r.height = window.outerHeight;
  415.     }
  416. }
  417.  
  418. // Returns the absolute X coordinate of an element
  419. // Source: DHTML Lab
  420. function getRealLeft(theElement) {
  421.     xPos = theElement.offsetLeft;
  422.     tempEl = theElement.offsetParent;
  423.     while (tempEl != null) {
  424.         xPos += tempEl.offsetLeft;
  425.         tempEl = tempEl.offsetParent;
  426.     }
  427.     return xPos;
  428. }
  429.  
  430. // Returns the absolute Y coordinate of an element
  431. // Source: DHTML Lab
  432. function getRealTop(theElement) {
  433.     yPos = theElement.offsetTop;
  434.     tempEl = theElement.offsetParent;
  435.     while (tempEl != null) {
  436.         yPos += tempEl.offsetTop;
  437.         tempEl = tempEl.offsetParent;
  438.     }
  439.     return yPos;
  440. }
  441.  
  442. // This gets the extent of the given object
  443. function getElementBounds(element, rect)
  444. {
  445.     if (typeof element.offsetLeft != 'undefined') {
  446.         rect.left = getRealLeft(element);
  447.         rect.top = getRealTop(element);
  448.         rect.width = element.offsetWidth;
  449.         rect.height = element.offsetHeight;
  450.     } else {
  451.         rect.left = 0;
  452.         rect.top = 0;
  453.         rect.width = 0;
  454.         rect.height = 0;
  455.     }
  456. }
  457.  
  458. // Sets the x/y coordinates and the popup width but
  459. // not the height, which auto-adjusts to the content.
  460. function setElementBounds(element, rect)
  461. {
  462.     element.style.left = rect.left + "px";
  463.     element.style.top = rect.top + "px";
  464.     element.style.width = rect.width + "px";
  465.     element.style.height = ""; //rect.height + "px";
  466. }
  467.  
  468. // Browser dependent GetElementById version
  469. function findElement(id)
  470. {
  471.     var ie = document.all;
  472.  
  473.     if (ie) {
  474.         return document.all(id);
  475.     } else {
  476.         return document.getElementById(id);
  477.     }
  478. }
  479.  
  480. ///////////////////////////////////////////////////////////////////////////////////////////////
  481. // Popup Functions
  482. //
  483.  
  484. var hidetimer = null;       // Helper timer. During the lifetime
  485.                             // of this timer OnMouseDown events
  486.                             // from the body will be ignored
  487. var closetimer = null;      // Timer used to close a popup upon
  488.                             // mouse click. Since the mouse click
  489.                             // could be on a link, the browser would
  490.                             // not load the target if we remove the
  491.                             // popup immediately.
  492. var thePopup = null;        // Holds the popup element, if one is active
  493.  
  494. // Fired when the hidetimer expires, simply
  495. // deactivates and initializes the timer
  496. // which signals that Body.OnMouseDown events
  497. // will be processed.
  498. function activateOnHide()
  499. {
  500.     clearTimeout(hidetimer);
  501.     hidetimer = null;
  502. }
  503.  
  504. // Shows a popup div
  505. // Parameters:
  506. //  trigger -           Element triggering the popup action. The
  507. //                      popup will be aligned on the lower left
  508. //                      edge of the TriggerElement.
  509. //  divid -             The id of the DIV element that contains
  510. //                      the popup content.
  511. function showPopup(trigger, divid)
  512. {
  513.     // if there is a popup visible at the
  514.     // moment, we need to close it.
  515.     if (thePopup != null) {
  516.         doClosePopup();
  517.     }
  518.  
  519.     thePopup = findElement(divid);
  520.  
  521.     if (thePopup == null)
  522.         return;
  523.  
  524.     var clientarea = new Rectangle;
  525.     var popuprect = new Rectangle;
  526.     var triggerrect = new Rectangle;
  527.  
  528.     getWindowClientArea(clientarea);
  529.     getElementBounds(thePopup, popuprect);
  530.     getElementBounds(trigger, triggerrect);
  531.  
  532.     // set the initial size, the height
  533.     // will adjust automatically
  534.     popuprect.left = 0;
  535.     popuprect.top = triggerrect.top + triggerrect.height;
  536.     popuprect.width = clientarea.width / 2;
  537.  
  538.     setElementBounds(thePopup, popuprect);
  539.  
  540.     // check if the popup is taller than
  541.     // the client area and reset it in that
  542.     // case
  543.     getElementBounds(thePopup, popuprect);
  544.  
  545.     var maxheight = clientarea.height - popuprect.top - 20;
  546.  
  547.     if ((maxheight > 0) && (popuprect.height > maxheight)) {
  548.         thePopup.style.overflow = "auto";
  549.         thePopup.style.height = maxheight;
  550.     }
  551.  
  552.     // show it
  553.     setElementVisible(thePopup, true);
  554.  
  555.     // prevent the popup from closing
  556.     // through a OnMouseDown on the body
  557.     // for a short period of time
  558.     hidetimer = setTimeout("activateOnHide();", 200);
  559. }
  560.  
  561. // Closes the current popup (if any) and
  562. // kills the close timer.
  563. function doClosePopup()
  564. {
  565.     clearTimeout(closetimer);
  566.     closetimer = null;
  567.  
  568.     if (thePopup != null) {
  569.         setElementVisible(thePopup, false);
  570.         thePopup = null;
  571.     }
  572. }
  573.  
  574. // Initiates closing the popup if
  575. //  * Hiding is not blocked by the hidetimer, or
  576. //  * the popup is already being closed
  577. function closePopup()
  578. {
  579.     if ((hidetimer != null) || (closetimer != null)) {
  580.         return;
  581.     }
  582.  
  583.     // to give clicked links a chance for
  584.     // begin activated, the actual closing
  585.     // is delayed a little.
  586.     closetimer = setTimeout("doClosePopup();", 400);
  587. }
  588.  
  589. ///////////////////////////////////////////////////////////////////////////////////////////////
  590. // Fixed header area functions
  591.  
  592. var scrollbaroffsetright = 0;
  593. var scrollbaroffsetbottom = 4;
  594.  
  595. // Sets up the non-scrolling region and scroll area
  596. // must be called whenever the window size changes
  597. function doSetupFixedHeader()
  598. {
  599.     if (document.body.clientWidth == 0)
  600.         return;
  601.  
  602.     var divFixed = findElement("areafixed");
  603.     var divScroll = findElement("areascroll");
  604.  
  605.     if (divScroll == null)
  606.         return;
  607.  
  608.     if (divFixed != null) {
  609.  
  610.         if (navigator.family == 'ie4') {
  611.             document.body.scroll = "no"
  612.              divFixed.style.width = document.body.offsetWidth - 1;
  613.             divScroll.style.paddingRight = "20px";
  614.         }
  615.  
  616.         divScroll.style.overflow= "auto";
  617.  
  618.         var clientarea = new Rectangle;
  619.         getWindowClientArea(clientarea);
  620.  
  621.         divScroll.style.width = clientarea.width - scrollbaroffsetright;
  622.         divScroll.style.top=0;
  623.  
  624.         if (clientarea.height > divFixed.offsetHeight + scrollbaroffsetbottom) {
  625.             var h = clientarea.height - (divFixed.offsetHeight + scrollbaroffsetbottom);
  626.             divScroll.style.height = h;
  627.         }
  628.         else {
  629.             divScroll.style.height = 0
  630.         }
  631.     }
  632. }
  633.  
  634. // makes the page scoll normally so
  635. // the print out will look ok.
  636. function doBeforePrinting() {
  637.     var i;
  638.  
  639.     if (window.text) {
  640.         document.all.text.style.height = "auto";
  641.     }
  642.  
  643.     for (i=0; i < document.all.length; i++){
  644.         if (document.all[i].tagName == "BODY") {
  645.             document.all[i].scroll = "yes";
  646.         }
  647.         if (document.all[i].id == "areafixed") {
  648.             document.all[i].style.margin = "0px 0px 0px 0px";
  649.             document.all[i].style.width = "100%";
  650.         }
  651.         if (document.all[i].id == "areascroll") {
  652.             document.all[i].style.overflow = "visible";
  653.             document.all[i].style.top = "5px";
  654.             document.all[i].style.width = "100%";
  655.             document.all[i].style.padding = "0px 10px 0px 30px";
  656.         }
  657.     }
  658.  
  659.     return;
  660. }
  661.  
  662. // reloads the page to reset after changes
  663. // in doBeforePrinting().
  664. function reloadPage() {
  665.     document.location.reload();
  666.     return;
  667. }
  668.  
  669. ///////////////////////////////////////////////////////////////////////////////////////////////
  670. // Expand/Collapse storage functions
  671.  
  672. var collapseStateCookieName = "DOM_Collapsed_Sections"
  673. var collapsePersistenceName = "domdocSettings"
  674.  
  675. // If we create browser based HTML files, this variable will be true
  676. var useCookies = false;
  677.  
  678. // If we create HTML Help or Help 2, this variable will be true
  679. var usePersistence = true;
  680.  
  681. ///////////////////////////////////////////////////////////////////////////////////////////////
  682. // Cookie helper functions
  683. // from http://www.quirksmode.org/js/cookies.html
  684.  
  685. function createCookie(name,value,days)
  686. {
  687.     var expires = "";
  688.  
  689.     if (days) {
  690.         var date = new Date();
  691.         date.setTime(date.getTime()+(days*24*60*60*1000));
  692.         expires = "; expires="+date.toGMTString();
  693.     }
  694.  
  695.     document.cookie = name+"="+value+expires+"; path=/";
  696. }
  697.  
  698. function readCookie(name)
  699. {
  700.     var nameEQ = name + "=";
  701.     var ca = document.cookie.split(';');
  702.     for(var i=0;i < ca.length;i++) {
  703.         var c = ca[i];
  704.         while (c.charAt(0)==' ') c = c.substring(1,c.length);
  705.         if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  706.     }
  707.     return null;
  708. }
  709.  
  710. function eraseCookie(name)
  711. {
  712.     createCookie(name,"",-1);
  713. }
  714.  
  715. ///////////////////////////////////////////////////////////////////////////////////////////////
  716. // Persistence functions for use in HTML Help and Help 2
  717.  
  718. // This variable temporarily holds the collapsed section
  719. // ids until the get stored using persistence.
  720. var persistentCollapsedIDs = "";
  721.  
  722. // Saves the persistent data from our temporary
  723. // variable which holds the value to the persistent
  724. // storage.
  725. function savePersistentData()
  726. {
  727.     var id = "persistenceDiv";
  728.     var pdiv = document.getElementById(id);
  729.     if (pdiv != null) {
  730.         try {
  731.             pdiv.setAttribute("collapsedIDs", persistentCollapsedIDs);
  732.             pdiv.save(collapsePersistenceName);
  733.         } catch (e) {
  734.             // HTML Help may trigger an exception
  735.         }
  736.     }
  737.     return;
  738. }
  739.  
  740. // Loads the persistent data from the persistent
  741. // storage into our temporary variable which holds
  742. // the value for further use.
  743. function loadPersistentData()
  744. {
  745.     persistentCollapsedIDs = "";
  746.  
  747.     var id = "persistenceDiv";
  748.     var pdiv = document.getElementById(id);
  749.     if (pdiv != null) {
  750.         try {
  751.             pdiv.load(collapsePersistenceName);
  752.             var data = pdiv.getAttribute("collapsedIDs");
  753.             if (data != null) {
  754.                 persistentCollapsedIDs = data;
  755.             }
  756.         }
  757.         catch (e) {
  758.             // HTML Help may trigger an exception
  759.         }
  760.     }
  761.     return;
  762. }
  763.  
  764. // Removes the persistent data from the storage.
  765. function removePersistenceData()
  766. {
  767.     var id = "persistenceDiv";
  768.     var pdiv = document.getElementById(id);
  769.     if (pdiv != null) {
  770.         try {
  771.             pdiv.removeAttribute("collapsedIDs");
  772.             pdiv.save(collapsePersistenceName);
  773.         }
  774.         catch (e) {
  775.             // HTML Help may trigger an exception
  776.         }
  777.     }
  778.     return;
  779. }
  780.  
  781. // Saves the persistent data to our temporary variable that
  782. // acts as storage while the page is being displayed.
  783. function savePersistentKey(key, value)
  784. {
  785.     persistentCollapsedIDs = value;
  786.     return;
  787. }
  788.  
  789. // Returns the content in our temporary variable that
  790. // acts as storage while the page is being displayed.
  791. function loadPersistentKey(key)
  792. {
  793.     return persistentCollapsedIDs;
  794. }
  795.  
  796. // Clears our temporary variable and erases
  797. // the value from the persistent storage.
  798. function removePersitentKey(key)
  799. {
  800.     persistentCollapsedIDs = "";
  801.     removePersistenceData();
  802.     return;
  803. }
  804.  
  805. ///////////////////////////////////////////////////////////////////////////////////////////////
  806. // Collapsed section storage functions
  807.  
  808. // Saves the ID list in ids either using
  809. // cookies or persistent storage,
  810. // depending on what we use right now.
  811. function saveExpandState(ids)
  812. {
  813.     if (useCookies) {
  814.         createCookie(collapseStateCookieName, ids, 14);  // we store the cookie for 14 days
  815.     } else if (usePersistence) {
  816.         savePersistentKey(collapsePersistenceName, ids);
  817.     }
  818.  
  819.     return;
  820. }
  821.  
  822. // Loads the collapsed ID list either from
  823. // cookies or persistent storage,
  824. // depending on what we use right now.
  825. function loadExpandState()
  826. {
  827.     var data = "";
  828.     if (useCookies) {
  829.         data = readCookie(collapseStateCookieName);
  830.     } else if (usePersistence) {
  831.         data = loadPersistentKey(collapsePersistenceName);
  832.     }
  833.  
  834.     return data;
  835. }
  836.  
  837. // Removes the collapsed ID list either from
  838. // cookies or persistent storage,
  839. // depending on what we use right now.
  840. function eraseExpandState()
  841. {
  842.     if (useCookies) {
  843.         eraseCookie(collapseStateCookieName);
  844.     } else if (usePersistence) {
  845.         removePersitentKey(collapsePersistenceName);
  846.     }
  847.  
  848.     return;
  849. }
  850.  
  851. //////////////////////////////////////////////////////////////////////////////////////////////
  852.  
  853. // Adds an ID to a list of IDs
  854. function doAddId(res, addId)
  855. {
  856.     var result = res;
  857.  
  858.     if (result != "") {
  859.         result = result + ",";
  860.     }
  861.  
  862.     result = result + addId;
  863.  
  864.     return result;
  865. }
  866.  
  867. // Converts the stored id into a div and
  868. // img Id an calls the showing function
  869. function doShowHideCollapsedId(id, visible)
  870. {
  871.     var imgid = "img" + id;
  872.     var divid = "div" + id;
  873.  
  874.     internalToggleVisibilityEx(imgid, divid, false, "", !visible, visible, "btn_expand_large.gif", "btn_collapse_large.gif");
  875. }
  876.  
  877. // Goes through the list of Ids passed in ids and
  878. // either adds a new ID, remove an ID, collapses
  879. // or expands the elements in the list.
  880. // Returns:
  881. //   The new list of IDs.
  882. // Parameters:
  883. //   ids -        a string with the list of IDs, separated
  884. //                by commas, ("ID1,ID2,ID3").
  885. //   addId -      an ID to be added to the list.
  886. //   removeId -   an ID to be removed from the list.
  887. //   collapsIds - a boolean that indicates if the elements
  888. //                in the list shall be collapsed.
  889. //   expandIds -  a boolean that indicates if the elements
  890. //                in the list shall be expanded.
  891. function processCollapsedIds(ids, addId, removeId, collapsIds, expandIds)
  892. {
  893.     var result = "";
  894.     var idlist = ids;
  895.  
  896.     while (idlist.length > 0) {
  897.         var id = "";
  898.         var idx = idlist.indexOf(',');
  899.  
  900.         if (idx >= 0) {
  901.             id = idlist.substring(0, idx);
  902.             idlist = idlist.substring(idx+1);
  903.         } else {
  904.             id = idlist;
  905.             idlist = "";
  906.         }
  907.  
  908.         if (collapsIds) {
  909.             doShowHideCollapsedId(id, false);
  910.         }
  911.  
  912.         if (expandIds) {
  913.             doShowHideCollapsedId(id, true);
  914.         }
  915.  
  916.         // check if add Id is
  917.         // already in the list
  918.         // so we don't add it twice
  919.         if (addId.length > 0) {
  920.             if (id == addId) {
  921.                 addId = "";
  922.             }
  923.         }
  924.  
  925.         // if the Id doesn't match
  926.         // removeId, we preserve it.
  927.         if (removeId.length > 0) {
  928.             if (id == removeId) {
  929.                 id = "";
  930.             }
  931.         }
  932.  
  933.         if (id.length > 0) {
  934.             result = doAddId(result, id);
  935.         }
  936.     }
  937.  
  938.     // if addId was not removed
  939.     // we add it.
  940.     if (addId != "") {
  941.         result = doAddId(result, addId);
  942.     }
  943.  
  944.     return result;
  945. }
  946.  
  947. // Reads the current collapse list and adds or
  948. // removes an ID to/from it.
  949. function modifyCollapseState(addid, removeid)
  950. {
  951.     var ids = loadExpandState();
  952.  
  953.     if (ids == null) {
  954.         ids = "";
  955.     }
  956.  
  957.     ids = processCollapsedIds(ids, addid, removeid, false, false);
  958.  
  959.     if (ids != "") {
  960.         saveExpandState(ids);
  961.     } else {
  962.         eraseExpandState();
  963.     }
  964. }
  965.  
  966. // Depending on visibility, removes or adds
  967. // an ID to the collaps list.
  968. function saveVisibilityState(id, visible)
  969. {
  970.     if (visible) {
  971.         modifyCollapseState("", id);
  972.     } else {
  973.         modifyCollapseState(id, "");
  974.     }
  975. }
  976.  
  977. // Restores the collaps states of all
  978. // stored elements.
  979. function loadCollapseStates()
  980. {
  981.     var ids = loadExpandState();
  982.  
  983.     if (ids != null) {
  984.         processCollapsedIds(ids, "", "", true, false);
  985.     }
  986. }
  987.  
  988. // this is the initial state the sections
  989. // are displayed in.
  990. var currentSectionStateExpanded = true;
  991.  
  992. // toggles the expand state of all sections
  993. // identified by "ids" and updates the link
  994. // text and link image.
  995. function ToggleAllElements(ids, linkTextID, imgID, collapseAllText, expandAllText)
  996. {
  997.     var link = document.getElementById(linkTextID);
  998.     var img = document.getElementById(imgID);
  999.  
  1000.     if (ids != null) {
  1001.         processCollapsedIds(ids, "", "", currentSectionStateExpanded, !currentSectionStateExpanded);
  1002.         currentSectionStateExpanded = !currentSectionStateExpanded;
  1003.     }
  1004.  
  1005.     if (link != null) {
  1006.         if (currentSectionStateExpanded) {
  1007.             link.innerHTML = collapseAllText;
  1008.         } else {
  1009.             link.innerHTML = expandAllText;
  1010.         }
  1011.     }
  1012.  
  1013.     if (img != null) {
  1014.         if (currentSectionStateExpanded) {
  1015.             img.src = "btn_collapse.gif";
  1016.         } else {
  1017.             img.src = "btn_expand.gif";
  1018.         }
  1019.     }
  1020. }
  1021.  
  1022. ///////////////////////////////////////////////////////////////////////////////////////////////
  1023. // Dynamic Index Display
  1024.           
  1025.  
  1026. // trims search text and converts to uppercase
  1027. function IndexPrepareSearchText(text)
  1028. {
  1029.   text = text.replace( /^\s+/g, "" );// strip leading
  1030.   text = text.replace( /\s+$/g, "" );// strip trailing
  1031.   text = text.toUpperCase();
  1032.   return text;
  1033. }
  1034.  
  1035. function IndexMatchesEntry(entry, text)
  1036. {
  1037.     if ((entry[0].indexOf(text) >= 0) || (entry[1].indexOf(text) >= 0)) {
  1038.         return true;
  1039.     } else {
  1040.         return false;
  1041.     }
  1042. }
  1043.  
  1044. function GetQuote()
  1045. {
  1046.     return unescape("%22");
  1047. }
  1048.  
  1049. function IndexPrintEntry(text, url, divclass)
  1050. {
  1051.     var result = "";
  1052.     var target = "";
  1053.  
  1054.     result = "<div class=" + GetQuote() + divclass + GetQuote() + ">";
  1055.  
  1056.     if (url.length > 0) {
  1057.         if (target.length > 0) {
  1058.             result = result + "<a href=" + GetQuote() + url + GetQuote() + " target=" + GetQuote() + target + GetQuote() + ">";
  1059.         } else {
  1060.             result = result + "<a href=" + GetQuote() + url + GetQuote() + ">";
  1061.         }
  1062.     }
  1063.  
  1064.     result = result + text;
  1065.  
  1066.     if (url.length > 0) {
  1067.         result = result + "</a>";
  1068.     }
  1069.  
  1070.     result = result + "</div>";
  1071.  
  1072.     return result;
  1073. }
  1074.  
  1075. function IndexGetEntry(lastentry, entry, classmain, classsub)
  1076. {
  1077.     var result = "";
  1078.  
  1079.     var printmainentry = true;
  1080.     var printsubentry = false;
  1081.     var urlmainentry = "";
  1082.     var urlsubentry = "";
  1083.  
  1084.     if (entry[1].length > 0) {
  1085.         printsubentry = true;
  1086.  
  1087.         if (lastentry != null) {
  1088.             if (lastentry[0] == entry[0]) {
  1089.                 printmainentry = false;
  1090.             }
  1091.         }
  1092.     }
  1093.  
  1094.     if ((printmainentry) && (!printsubentry)) {
  1095.         urlmainentry = entry[2];
  1096.     }
  1097.  
  1098.     if (printsubentry) {
  1099.         urlsubentry = entry[2];
  1100.     }
  1101.  
  1102.     if (printmainentry) {
  1103.         result = result + IndexPrintEntry(entry[3], urlmainentry, classmain);
  1104.     }
  1105.     if (printsubentry) {
  1106.         result = result + IndexPrintEntry(entry[4], urlsubentry, classsub);
  1107.     }
  1108.  
  1109.     return result;
  1110. }
  1111.  
  1112. var searchTimer = null;
  1113. var currentSearchText = "";
  1114. var searchDynamicDivID = "";
  1115. var searchResultDivID = "";
  1116. var searchClassMainEntry = "";
  1117. var searchClassSubEntry = "";
  1118.  
  1119. function IndexClearSearchTimer()
  1120. {
  1121.     if (searchTimer != null) {
  1122.        clearTimeout(searchTimer);
  1123.        searchTimer = null;
  1124.     }
  1125.  
  1126.     return true;
  1127. }
  1128.  
  1129. function DoIndexSearch()
  1130. {
  1131.     var dynamicdiv, resultdiv;
  1132.     var entry, lastentry, cnt, k, searchtext;
  1133.     var outputHTML = "";
  1134.  
  1135.     IndexClearSearchTimer();
  1136.  
  1137.     dynamicdiv = document.getElementById(searchDynamicDivID);
  1138.     resultdiv = document.getElementById(searchResultDivID);
  1139.  
  1140.     if ((dynamicdiv != null) && (resultdiv != null)) {
  1141.         cnt = 0;
  1142.         searchtext = IndexPrepareSearchText(currentSearchText);
  1143.  
  1144.         if (searchtext.length > 0) {
  1145.             IndexFill();
  1146.  
  1147.             lastentry = null;
  1148.  
  1149.             for(k = 0; k < theIndex.length; k++) {
  1150.                 entry = theIndex[k];
  1151.  
  1152.                 if (IndexMatchesEntry(entry, searchtext)) {
  1153.                     outputHTML = outputHTML + IndexGetEntry(lastentry, entry, searchClassMainEntry, searchClassSubEntry);
  1154.  
  1155.                     lastentry = entry;
  1156.                     cnt++;
  1157.                 }
  1158.             }
  1159.         }
  1160.  
  1161.         if (cnt > 0) {
  1162.             resultdiv.innerHTML = outputHTML;
  1163.             dynamicdiv.style.display = '';
  1164.         } else {
  1165.             dynamicdiv.style.display = 'none';
  1166.         }
  1167.     }
  1168.  
  1169.     return true;
  1170. }
  1171.  
  1172. // instant index search invoked by pressing the search button
  1173. function IndexSearch(text, dynamicdivid, resultdivid, classmain, classsub)
  1174. {
  1175.     currentSearchText = text;
  1176.     searchDynamicDivID = dynamicdivid;
  1177.     searchResultDivID = resultdivid;
  1178.     searchClassMainEntry = classmain;
  1179.     searchClassSubEntry = classsub;
  1180.  
  1181.     DoIndexSearch();
  1182. }
  1183.  
  1184. // delayed index search invoked when entering text in the search field.
  1185. function IndexDelaySearch(text, dynamicdivid, resultdivid, classmain, classsub)
  1186. {
  1187.     if (text != currentSearchText) {
  1188.         IndexClearSearchTimer();
  1189.  
  1190.         currentSearchText = text;
  1191.         searchDynamicDivID = dynamicdivid;
  1192.         searchResultDivID = resultdivid;
  1193.         searchClassMainEntry = classmain;
  1194.         searchClassSubEntry = classsub;
  1195.  
  1196.         searchTimer = setTimeout("DoIndexSearch();", 500);
  1197.     }
  1198.  
  1199.     return true;
  1200. }
  1201.  
  1202.  
  1203. ///////////////////////////////////////////////////////////////////////////////////////////////
  1204. // event handlers
  1205.  
  1206. // Process key input
  1207. function ieKey()
  1208. {
  1209.     if (window.event.keyCode == 27) {
  1210.         closePopup();
  1211.         doSetupFixedHeader();
  1212.         onResizeWindow();
  1213.     }
  1214. }
  1215.  
  1216. // Called when the brower window resizes
  1217. function onResizeWindow()
  1218. {
  1219.     doSetupFixedHeader();  //resize the scroll area
  1220.     return;
  1221. }
  1222.  
  1223. function fixMoniker()
  1224. {
  1225.     var curURL = document.location + ".";
  1226.     var pos = curURL.indexOf("mk:@MSITStore");
  1227.     if( pos == 0 ) {
  1228.         alert("old URL: " + curURL);
  1229.         curURL = "ms-its:" + curURL.substring(14,curURL.length-1);
  1230.         alert("replacing URL with: " + curURL);
  1231.         document.location.replace(curURL);
  1232.         return false;
  1233.     } else {
  1234.         return true;
  1235.     }
  1236. }
  1237.  
  1238. //fixMoniker();
  1239.  
  1240. // Initialize the Header
  1241. function onBodyLoad()
  1242. {
  1243.     doSetupFixedHeader();
  1244.     document.onkeypress = ieKey;
  1245.     window.onresize = onResizeWindow;
  1246.  
  1247.     if (navigator.family == 'ie4') {
  1248.         window.onbeforeprint = doBeforePrinting;
  1249.         window.onafterprint = reloadPage;
  1250.     }
  1251.  
  1252.     // if we use persistence we
  1253.     // load the settings now
  1254.     if (usePersistence) {
  1255.         loadPersistentData();
  1256.         window.onunload = onUnloadWindow;
  1257.     }
  1258.  
  1259.     // restore collapsed sections
  1260.     loadCollapseStates();
  1261. }
  1262.  
  1263. // used to save settings to the persistent
  1264. // storage if we use it.
  1265. function onUnloadWindow()
  1266. {
  1267.     if (usePersistence) {
  1268.         savePersistentData();
  1269.     }
  1270.     return;
  1271. }
  1272.  
  1273. // called if we're using framesets in
  1274. function onBodyLoadEx(framesetfile, targetframe, topicfile)
  1275. {
  1276.     loadFrameSetOrTitle(framesetfile, targetframe, topicfile);
  1277.     onBodyLoad();
  1278.     synchTOC(topicfile);
  1279.     return true;
  1280. }
  1281.  
  1282. // Process mouse down events, close open popups
  1283. // and realign the fixed header area.
  1284. function onBodyMouseDown()
  1285. {
  1286.     closePopup();
  1287.     doSetupFixedHeader();
  1288. }
  1289.  
  1290. // Opens the big version of an image in a secondary window
  1291. function openBigImage(image)
  1292. {
  1293.     window.open(image, "_blank", "toolbar=no,status=no,menubar=no,resizable=yes");
  1294.     return true;
  1295. }
  1296.  
  1297. function switchImage(img, src)
  1298. {
  1299.     img.src = src;
  1300.     return true;
  1301. }
  1302.  
  1303. // opens a mail window and fills the
  1304. // address, subject and body
  1305. function sendFeedback(mailto, subject, body)
  1306. {
  1307.     var href = "mailto:" + mailto + "?subject=" + subject + "&body=" + body;
  1308.     window.open(href, "_top");
  1309. }
  1310.  
  1311. ///////////////////////////////////////////////////////////////////////////////////////////////
  1312. // Browser detection
  1313. // Source: http://devedge.netscape.com/toolbox/examples/2002/xb/ua/
  1314.  
  1315. /* ***** BEGIN LICENSE BLOCK *****
  1316.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  1317.  *
  1318.  * The contents of this file are subject to the Mozilla Public License Version
  1319.  * 1.1 (the "License"); you may not use this file except in compliance with
  1320.  * the License. You may obtain a copy of the License at
  1321.  * http://www.mozilla.org/MPL/
  1322.  *
  1323.  * Software distributed under the License is distributed on an "AS IS" basis,
  1324.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  1325.  * for the specific language governing rights and limitations under the
  1326.  * License.
  1327.  *
  1328.  * The Original Code is Netscape code.
  1329.  *
  1330.  * The Initial Developer of the Original Code is
  1331.  * Netscape Corporation.
  1332.  * Portions created by the Initial Developer are Copyright (C) 2001
  1333.  * the Initial Developer. All Rights Reserved.
  1334.  *
  1335.  * Contributor(s): Bob Clary <bclary@netscape.com>
  1336.  *
  1337.  * ***** END LICENSE BLOCK ***** */
  1338.  
  1339. function xbDetectBrowser()
  1340. {
  1341.   var oldOnError = window.onerror;
  1342.   var element = null;
  1343.  
  1344.   window.onerror = null;
  1345.   
  1346.   // work around bug in xpcdom Mozilla 0.9.1
  1347.   window.saveNavigator = window.navigator;
  1348.  
  1349.   navigator.OS    = '';
  1350.   navigator.version  = parseFloat(navigator.appVersion);
  1351.   navigator.org    = '';
  1352.   navigator.family  = '';
  1353.  
  1354.   var platform;
  1355.   if (typeof(window.navigator.platform) != 'undefined')
  1356.   {
  1357.     platform = window.navigator.platform.toLowerCase();
  1358.     if (platform.indexOf('win') != -1)
  1359.       navigator.OS = 'win';
  1360.     else if (platform.indexOf('mac') != -1)
  1361.       navigator.OS = 'mac';
  1362.     else if (platform.indexOf('unix') != -1 || platform.indexOf('linux') != -1 || platform.indexOf('sun') != -1)
  1363.       navigator.OS = 'nix';
  1364.   }
  1365.  
  1366.   var i = 0;
  1367.   var ua = window.navigator.userAgent.toLowerCase();
  1368.   
  1369.   if (ua.indexOf('opera') != -1)
  1370.   {
  1371.     i = ua.indexOf('opera');
  1372.     navigator.family  = 'opera';
  1373.     navigator.org    = 'opera';
  1374.     navigator.version  = parseFloat('0' + ua.substr(i+6), 10);
  1375.   }
  1376.   else if ((i = ua.indexOf('msie')) != -1)
  1377.   {
  1378.     navigator.org    = 'microsoft';
  1379.     navigator.version  = parseFloat('0' + ua.substr(i+5), 10);
  1380.     
  1381.     if (navigator.version < 4)
  1382.       navigator.family = 'ie3';
  1383.     else
  1384.       navigator.family = 'ie4'
  1385.   }
  1386.   else if (ua.indexOf('gecko') != -1)
  1387.   {
  1388.     navigator.family = 'gecko';
  1389.     var rvStart = ua.indexOf('rv:');
  1390.     var rvEnd   = ua.indexOf(')', rvStart);
  1391.     var rv      = ua.substring(rvStart+3, rvEnd);
  1392.     var rvParts = rv.split('.');
  1393.     var rvValue = 0;
  1394.     var exp     = 1;
  1395.  
  1396.     for (var i = 0; i < rvParts.length; i++)
  1397.     {
  1398.       var val = parseInt(rvParts[i]);
  1399.       rvValue += val / exp;
  1400.       exp *= 100;
  1401.     }
  1402.     navigator.version = rvValue;
  1403.  
  1404.     if (ua.indexOf('netscape') != -1)
  1405.       navigator.org = 'netscape';
  1406.     else if (ua.indexOf('compuserve') != -1)
  1407.       navigator.org = 'compuserve';
  1408.     else
  1409.       navigator.org = 'mozilla';
  1410.   }
  1411.   else if ((ua.indexOf('mozilla') !=-1) && (ua.indexOf('spoofer')==-1) && (ua.indexOf('compatible') == -1) && (ua.indexOf('opera')==-1)&& (ua.indexOf('webtv')==-1) && (ua.indexOf('hotjava')==-1))
  1412.   {
  1413.     var is_major = parseFloat(navigator.appVersion);
  1414.     
  1415.     if (is_major < 4)
  1416.       navigator.version = is_major;
  1417.     else
  1418.     {
  1419.       i = ua.lastIndexOf('/')
  1420.       navigator.version = parseFloat('0' + ua.substr(i+1), 10);
  1421.     }
  1422.     navigator.org = 'netscape';
  1423.     navigator.family = 'nn' + parseInt(navigator.appVersion);
  1424.   }
  1425.   else if ((i = ua.indexOf('aol')) != -1 )
  1426.   {
  1427.     // aol
  1428.     navigator.family  = 'aol';
  1429.     navigator.org    = 'aol';
  1430.     navigator.version  = parseFloat('0' + ua.substr(i+4), 10);
  1431.   }
  1432.   else if ((i = ua.indexOf('hotjava')) != -1 )
  1433.   {
  1434.     // hotjava
  1435.     navigator.family  = 'hotjava';
  1436.     navigator.org    = 'sun';
  1437.     navigator.version  = parseFloat(navigator.appVersion);
  1438.   }
  1439.  
  1440.   window.onerror = oldOnError;
  1441. }
  1442.  
  1443. xbDetectBrowser();
  1444.  
  1445.